# 闭包：外函数嵌套子函数，外函数返回的是子函数的地址值
"""
def outer():        # 外函数
    print("外面的函数正在运行")
    def inner():        #子函数
        print("里面的函数正在运行")
    return inner        # 没有加小括号，就表示地址值

# print(outer())      # 直接打印，是inner地址值

# 调用闭包函数
# r = outer()     # 赋值了一个变量
# r()     # 变量加上()，调用闭包

#直接给他上括号呢？
outer()()   #不建议这么去做
"""

#每次调用自增+1的函数
def add():      # add函数名称，同时也是父函数
    num = 0     # 定义了num局部变量
    def nums(): # nums函数名称，同时也是子函数
        nonlocal num        # nonlocal：子函数引用父函数局部变量进行修改
        num += 1        #每次让num+1再去返回
        return num      # 子函数返回处理过后的变量值
    return nums     # 返回nums的地址值
# 调用这个函数，让他每次+1

# 使用调用的都是同一个对象
"""
r = add()       
print(r())      # 1
print(r())      # 2
print(r())      # 3
print(r())      # 4
print(r())      # 5
"""
# 相当于每一次，重新调用了一个新的闭包函数
"""
print(add()())  # 1
print(add()())  # 1
print(add()())  # 1
print(add()())  # 1
"""





